package com.example.demokotlin

import org.junit.Test


/**
 * 构造函数测试
 * 初始化顺序：（主类一次）
 * 1）主构造函数里的声明属性
 * 2）类级别的属性赋值
 * 3）init初始化里的属性赋值和函数调用
 * 4）次构造函数里的属性赋值和函数调用
 * 次构造函数需要调用主构造函数
 *
 * @author zhouronghua
 * @time 2021/9/28 8:54 上午
 */
class ConstructTest {

    /**
     * 1）主构造函数属性初始化
     */
    class Student(
        _name: String, // 没有加标记符是临时变量需要通过成员接收
        val age: Int   // val或者var是成员变量
    ) {
        // 2) 类成员属性初始化
        var name = _name
        var score = 10
        val subject: String

        private val sex = "男"

        // 3）init函数处理(主构造函数调用，不是Java的静态代码块，相当于Java的构造代码块)
        // 执行任意主构造函数的时候，都会执行init代码块
        init {
            println("Student init score:$score")
            subject = "国语"
        }

        // 4）次构造函数处理
        constructor(_name: String) : this(_name, 10) {
            println("Student 次构造函数")
            score = 20
        }
    }

    /**
     * 测试初始化顺序
     *
     * @author zhouronghua
     * @time 2021/9/29 5:05 下午
     */
    @Test
    fun testInit() {
        println("=== 测试类初始化 ===")
        val student = Student("黎明")
        println("student name: ${student.name} age: ${student.age}")

    }
}